#ifndef DATA_VIEW_H
#define DATA_VIEW_H

#include <QWidget>
#include <QVector>
#include <QString>
#include <QDir>
#include <QMessageBox>
#include <QDateTime>
#include <QByteArray>
#include <QFile>
#include "pagination.h"
#include "state_info.h"

class DealerHandler;

struct SelectFramesParams
{
    QString srcHost;
    QString dstHost;
    int64_t startTime;
    int64_t endTime;
    int limit;
    int offset;
    int pointAddress;
};

/**
 * @brief 方向结构体
 */
struct Direction
{
    QString name;
};

/**
 * @brief 报文类型结构体
 */
struct PacketType
{
    QString name;
};

/**
 * @brief 类型标识结构体
 */
struct TypeIdentification
{
    QString name;
    QString value;
    QString description;
};

/**
 * @brief VSQ结构体
 */
struct VSQ
{
    int sq;
    int num;
};

/**
 * @brief 原因结构体
 */
struct Cause
{
    QString name;
    QString code;
    QString description;
};

/**
 * @brief COT结构体
 */
struct COT
{
    int causeIndex;
    int pn;
    int t;
    int srcAdr;
    Cause cause;
};

/**
 * @brief 数字信号结构体
 */
struct DigitalSignal
{
    int infoAdr;        ///< 信息地址
    QString hexInfoAdr; ///< 十六进制信息地址
    int iv;
    int nt;
    int sb;
    int bl;
    int spi;
};

/**
 * @brief 模拟信号结构体
 */
struct AnalogSignal
{
    int infoAdr;        ///< 信息地址
    QString hexInfoAdr; ///< 十六进制信息地址
    double val;
};

/**
 * @brief 报文结构体
 */
struct Packet
{
    PacketType packetType;
    QVector<int8_t> controlFields;
    QVector<int8_t> asduBytes;
    int sendNumber;
    int receiveNumber;
    TypeIdentification tieIdentification;
    VSQ vsq;
    COT cot;
    QVector<int8_t> asduAddress;
    QVector<DigitalSignal> digitalSignals;
    QVector<AnalogSignal> analogSignals;
};

/**
 * @brief 帧数据结构体
 */
struct FrameData
{
    int id;
    QVector<int8_t> apduBytes;
    QString srcHost;
    QString dstHost;
    int srcPort;
    int dstPort;
    Direction direction;
    Packet packet;
    int64_t timestamp;
};

/**
 * @brief 查询结果
 */
struct SelectFramesResult
{
    int64_t id;                    ///< 帧ID
    int pointAddress;              ///< 点号
    double pointValue;             ///< 点值
    int pointType;                 ///< 点类型
    QString pointTypeDesc;         ///< 点类型描述
    QString pointDesc;             ///< 点描述
    int tieIdentification;         ///< 类型标识TI
    int cause;                     ///< 传输原因COT
    QString tieIdentificationDesc; ///< 类型标识TI描述
    QString causeDesc;             ///< 传输原因COT描述
    QString srcHost;               ///< 源主机
    QString srcName;               ///< 源主机名称
    QString dstHost;               ///< 目的主机
    QString dstName;               ///< 目的主机名称
    QString direction;             ///< 方向
    QString directionDesc;         ///< 方向描述
    QString dataPlane;             ///< 数据平面
    int64_t timestamp;             ///< 时间戳
    QString timestampStr;          ///< 时间戳字符串
};

namespace Ui
{
    class DataView;
}

class SearchTreeWidget;

class DataView : public QWidget
{
    Q_OBJECT

public:
    explicit DataView(SearchTreeWidget *search_tree, QWidget *parent = nullptr);
    ~DataView();

protected:
    void showEvent(QShowEvent *event) override;

private slots:
    /**
     * 搜索按钮点击事件
     */
    void onSearchButtonClicked();
    /**
     * 网络消息接收事件
     */
    void onNetworkMessageReceived(const QString &method, const QString &body);
    /**
     * 生成报告按钮点击事件
     */
    void onGenerateReportButtonClicked();

    /**
     * @brief 处理搜索树形控件项点击
     * @param state_info 点击的项
     */
    void onSearchTreeWidgetItemClicked(StateInfo state_info);

    /**
     * @brief 上一页按钮点击事件
     */
    void onPrevPageButtonClicked();

    /**
     * @brief 下一页按钮点击事件
     */
    void onNextPageButtonClicked();

    /**
     * @brief 更新表格数据
     */
    void updateDataTable();

    /**
     * @brief 处理报文方向过滤
     */
    void onDirectionFilterChanged();

private:
    Ui::DataView *ui_;
    // 网络相关成员
    DealerHandler *dealer_handler_;

    /**
     * @brief 生成获取点号信息请求体
     * @return 返回JSON格式的请求体字符串
     */
    QString generateSelectPointInfoBody();

    /**
     * @brief 搜索树形控件
     */
    SearchTreeWidget *search_tree_;

    /**
     * @brief 查询结果
     */
    QVector<SelectFramesResult> select_frames_result_;

    /**
     * @brief 当前变电站
     */
    StateInfo *current_state_info_;

    /**
     * @brief 分页对象
     */
    Pagination<SelectFramesResult> pagination_;

    /**
     * @brief 更新分页UI
     */
    void updatePaginationUI();

    /**
     * @brief 根据方向过滤条件过滤数据
     * @param data 待过滤的数据
     * @return 过滤后的数据
     */
    QVector<SelectFramesResult> filterByDirection(const QVector<SelectFramesResult> &data);

    /**
     * @brief 初始化点表下拉框
     */
    void initPointComboBox();
};

#endif // DATA_VIEW_H